home *** CD-ROM | disk | FTP | other *** search
- //
- // BEGIN FLOCK GPL
- //
- // Copyright Flock Inc. 2005-2007
- // http://flock.com
- //
- // This file may be used under the terms of of the
- // GNU General Public License Version 2 or later (the "GPL"),
- // http://www.gnu.org/licenses/gpl.html
- //
- // Software distributed under the License is distributed on an "AS IS" basis,
- // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- // for the specific language governing rights and limitations under the
- // License.
- //
- // END FLOCK GPL
- //
-
- const Cc = Components.classes;
- const Ci = Components.interfaces;
- const Cr = Components.results;
-
- const ENABLE_DEBUG = true;
- function DEBUG(x) { if (ENABLE_DEBUG) debug("flockSearchvideoService: "+x+"\n"); }
-
- const SEARCHVIDEO_TITLE = "Truveo Web Service";
- const SEARCHVIDEO_FAVICON = "http://www.searchvideo.com/favicon.ico";
- const SEARCHVIDEO_CID = Components.ID("{31def21e-02d6-4d9a-848c-2c1895e50626}");
- const SEARCHVIDEO_CONTRACTID = "@flock.com/?photo-api-searchvideo;1";
- const APPID = "1x1jhj64466mi12ia";
-
- var gCompTK;
- var alreadySearched = false;
- function getCompTK() {
- if (!gCompTK) {
- gCompTK = Cc["@flock.com/singleton;1"].getService(Ci.flockISingleton)
- .getSingleton("chrome://browser/content/flock/services/common/load-compTK.js").wrappedJSObject;
- }
- return gCompTK;
- }
-
-
- function loadLibraryFromSpec(aSpec)
- {
- var loader = Cc["@mozilla.org/moz/jssubscript-loader;1"]
- .getService(Ci.mozIJSSubScriptLoader);
- loader.loadSubScript(aSpec);
- }
- loadLibraryFromSpec("chrome://browser/content/flock/photo/photoAPI.js");
-
- function searchvideoPhoto() {}
-
- searchvideoPhoto.prototype = {
- id: "",
- thumbnail: "",
- webPageUrl: "",
- midSizePhoto: "",
- largeSizePhoto: "",
- title: "",
- username: "",
- userid: "",
- embedTag: "",
- is_public: "true",
- is_video: "true",
- svcShortName: 'searchvideo',
- has_miniView: "true",
- buildTooltip: function( ) {
- // do we have to use document from the window to ceate elements? -- ja
- var wm = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
- var win = wm.getMostRecentWindow('navigator:browser');
- if (!win) return null;
-
- var hbox = win.document.createElement('hbox');
- var img = win.document.createElement('image');
- img.setAttribute('src', this.icon );
- hbox.appendChild(img);
- var box = win.document.createElement('vbox');
- box.setAttribute('style', 'max-width: 300px');
- var title = win.document.createElement('label');
- title.setAttribute('value', this.title );
- title.setAttribute('crop', 'end');
- box.appendChild(title);
- var lbl = win.document.createElement('label');
- lbl.setAttribute('value', this.username );
- lbl.setAttribute('class', 'user');
- box.appendChild(lbl);
- hbox.appendChild(box)
-
- var vbox = win.document.createElement('vbox');
- var cbox = win.document.createElement('cbox');
- var largeImg = win.document.createElement('image');
- largeImg.setAttribute('src', this.midSizePhoto);
- largeImg.setAttribute('style', 'margin-bottom: 2px;');
- var spacer = win.document.createElement('spacer');
- spacer.setAttribute('flex', '1');
- cbox.appendChild(largeImg);
- cbox.appendChild(spacer);
- vbox.appendChild(cbox);
- vbox.appendChild(hbox);
-
- return vbox;
- },
- buildHTML: function ( ) {
- return this.embedTag;
- },
- buildBBCode: function ( ) {
- return '[url=' + this.webPageUrl + '][img]'+ this.midSizePhoto +'[/img][/url]';
- },
- buildMiniPage: function ( ) {
- return this.webPageUrl;
- },
- QueryInterface: function(iid) {
- if (!iid.equals(Ci.nsISupports) &&
- !iid.equals(Ci.flockIPhoto)) {
- throw Cr.NS_ERROR_NO_INTERFACE;
- }
- return this;
- }
- };
-
-
- searchvideoPhoto.prototype.__defineGetter__('metaData', function () {
- var metaData = Components.classes["@mozilla.org/hash-property-bag;1"].createInstance(Components.interfaces.nsIWritablePropertyBag2);
- metaData.setPropertyAsAString("title", this.title);
- metaData.QueryInterface(Components.interfaces.nsIPropertyBag);
-
- // expose other metadata props here, then you can display them with custom xbls
- // which extend from the generic photo binding
-
- return metaData;
- })
- // ====================================================
- // ========== BEGIN searchvideoService class ==========
- // ====================================================
-
- function searchvideoService() {
- this.url = "http://www.searchvideo.com";
- this._ctk = {
- interfaces: [
- "nsISupports",
- "nsIClassInfo",
- "nsISupportsCString",
- "nsIObserver",
- "flockIPhotoAPI",
- "flockIWebService",
- "flockIMediaWebService",
- ],
- shortName: "searchvideo",
- fullName: "Truveo",
- description: SEARCHVIDEO_TITLE,
- favicon: SEARCHVIDEO_FAVICON,
- CID: SEARCHVIDEO_CID,
- contractID: SEARCHVIDEO_CONTRACTID
- };
-
- this.webDetective = Cc["@flock.com/account-utils;1"].getService(Ci.flockIAccountUtils).useWebDetective("searchvideo.xml");
- this.faves_coop = Components.classes['@flock.com/singleton;1'].getService(Components.interfaces.flockISingleton).getSingleton('chrome://browser/content/flock/common/load-faves-coop.js').wrappedJSObject;
- this._logger = Cc['@flock.com/logger;1'].createInstance(Ci.flockILogger);
- this._logger.init('searchvideo');
- }
-
- searchvideoService.prototype.serviceName = "Truveo";
- searchvideoService.prototype.shortName = "searchvideo";
- searchvideoService.prototype.iconUrl = "chrome://browser/skin/flock/photo/searchvideoIcon.png";
- searchvideoService.prototype.count = 1;
-
-
- searchvideoService.prototype.getPhotoFromRDFNode =
- function (aRDFId)
- {
- var newPhoto = new searchvideoPhoto();
- var coopPhoto = this.faves_coop.get(aRDFId);
- newPhoto.webPageUrl = coopPhoto.URL;
- newPhoto.thumbnail = coopPhoto.thumbnail;
- newPhoto.midSizePhoto = coopPhoto.midSizePhoto;
- newPhoto.largeSizePhoto = coopPhoto.largeSizePhoto;
- newPhoto.username = coopPhoto.username;
- newPhoto.userid = coopPhoto.userid;
- newPhoto.title = coopPhoto.name;
- newPhoto.id = coopPhoto.photoid;
- newPhoto.icon = coopPhoto.favicon;
- newPhoto.uploadDate = coopPhoto.datevalue;
- newPhoto.is_public = coopPhoto.is_public;
- newPhoto.is_video = coopPhoto.is_video;
- return newPhoto;
- }
-
- searchvideoService.prototype.handlePhotosResult =
- function (aXML, aUserid) {
- var rval = new Array();
- var response = aXML.getElementsByTagName("VideoSet")[0];
- var videoList = aXML.getElementsByTagName("Video");
- for (var i = 0; i < videoList.length; i++) {
- var video = videoList[i];
-
- var newPhoto = new searchvideoPhoto();
- newPhoto.id = video.getElementsByTagName("id")[0].textContent;
- newPhoto.title = video.getElementsByTagName("title")[0].textContent;
- newPhoto.webPageUrl = video.getElementsByTagName("videoUrl")[0].textContent;
- newPhoto.thumbnail = video.getElementsByTagName("thumbnailUrl")[0].textContent;
- var largeThumbnail = video.getElementsByTagName("thumbnailUrlLarge");
- if (largeThumbnail.length > 0) {
- newPhoto.midSizePhoto = largeThumbnail[0].textContent;
- newPhoto.largeSizePhoto = largeThumbnail[0].textContent;
- }
- else {
- newPhoto.midSizePhoto = newPhoto.thumbnail;
- newPhoto.largeSizePhoto = newPhoto.thumbnail;
- }
- newPhoto.username = video.getElementsByTagName("channel")[0].textContent;
- newPhoto.userid = video.getElementsByTagName("channelUrl")[0].textContent;
- var dateProduced = video.getElementsByTagName("dateProduced");
- if (dateProduced.length > 0)
- newPhoto.uploadDate = dateProduced[0].textContent;
- else
- newPhoto.uploadDate = video.getElementsByTagName("dateFound")[0].textContent;
- newPhoto.is_public = true;
- newPhoto.is_video = true;
- newPhoto.embedTag = video.getElementsByTagName("videoResultEmbedTag")[0].textContent;
- rval.push(newPhoto);
- }
- return rval;
- }
-
- searchvideoService.prototype.queryChannel =
- function searchvideoService_queryChannel(aListener, aQueryString, aCount, aPage) {
- var aQuery = new queryHelper(aQueryString);
- var inst=this;
- var myListener = {
- onResult: function (aXML) {
- var rval = inst.handlePhotosResult(aXML);
- var enum_ = {
- hasMoreElements: function() {
- return (rval.length>0);
- },
- getNext: function() {
- return rval.shift();
- }
- }
- aListener.onSearchResult(enum_);
- },
- onError: function (aError) {
- aListener.onError(aError);
- }
- }
-
- var params = {
- results: (aCount ? aCount : 50),
- start: (aPage ? aPage : 1)
- };
-
- switch (aQuery.special) {
- case "recent": params.query = "sort:mostRecent "; break;
- case "topfav": params.query = "sort:topFavorites "; break;
- case "pop": params.query = "sort:mostPopular "; break;
- case "poptoday": params.query = "sort:mostPopularToday "; break;
- case "popweek": params.query = "sort:mostPopularThisWeek "; break;
- case "popmonth": params.query = "sort:mostPopularThisMonth "; break;
- case "abc": params.query = "sort:mostPopular channel:ABC "; break;
- case "myspace": params.query = "sort:mostPopular channel:MYSPACE "; break;
- case "disney": params.query = "sort:mostPopular channel:Disney "; break;
- default: params.query = "sort:vrank ";
- }
-
- if (aQuery.search)
- params.query += aQuery.search;
-
- this.call(myListener, "truveo.videos.getVideos", params);
- }
-
- searchvideoService.prototype.search =
- function searchvideoService_search(aListener, aQueryString, aCount, aPage) {
-
- //this.count = this.count+aCount;
- // Searchvideo only supports channel queries for now
- if(aPage == 1) this.count = 1;
- this.queryChannel(aListener, aQueryString, aCount, (aPage ? this.count : 1));
- this.count = aCount + this.count;
- }
-
- searchvideoService.prototype.supportsSearch =
- function searchvideoService_supportsSearch( aQueryString ) {
- var aQuery = new queryHelper(aQueryString);
-
- if (aQuery.special) {
- var channel = channels["special:" + aQuery.special];
- if (channel) {
- return channel.supportsSearch;
- }
- }
-
- if (aQuery.search) return false;
- if (aQuery.user) return true;
- return false;
- }
-
- var channels = {
- "special:all": {
- title: "All",
- supportsSearch: true
- },
- "special:topfav": {
- title: "Top Favorites",
- supportsSearch: true
- },
- "special:pop": {
- title: "Most Popular",
- supportsSearch: true
- },
- "special:abc": {
- title: "Best of ABC",
- supportsSearch: true
- },
- "special:myspace": {
- title: "Best of MySpace",
- supportsSearch: true
- }
- /* "special:disney": {
- title: "Best of Disney",
- supportsSearch: true
- }
- "poptoday": {
- title: "Most Popular Today",
- supportsSearch: true,
- },
- "popweek": {
- title: "Most Popular This Week",
- supportsSearch: true,
- },
- "popmonth": {
- title: "Most Popular This Month",
- supportsSearch: true,
- },*/
- }
-
- searchvideoService.prototype.getChannel =
- function searchvideoService_getChannel(aChannelId) {
- if (!(aChannelId in channels)) return null;
-
- var nc = Cc["@flock.com/media-channel;1"].createInstance(Ci.flockIMediaChannel);
- nc.id = aChannelId;
- nc.title = channels[aChannelId].title
- nc.supportsSearch = channels[aChannelId].supportsSearch;
- return nc;
- }
-
- searchvideoService.prototype.__defineGetter__("channels", function () {
- var ar = new Array();
-
- for (var id in channels) {
- var nc = Cc["@flock.com/media-channel;1"].createInstance(Ci.flockIMediaChannel);
- nc.id = id;
- nc.title = channels[id].title
- nc.supportsSearch = channels[id].supportsSearch;
- ar.push(nc);
- }
-
- var rval = {
- getNext: function() {
- return ar.shift();
- },
- hasMoreElements: function() {
- return (ar.length>0);
- }
- }
- return rval;
- })
-
- searchvideoService.prototype.getError =
- function searchvideoService_getError (aErrorType, aXML, aHTTPErrorCode) {
- var error = Components.classes["@flock.com/error;1"].createInstance(Ci.flockIError);
- if (aErrorType == "HTTP_ERROR") {
- error.errorCode = aHTTPErrorCode;
- } else if (aErrorType == "SERVICE_ERROR") {
- var errorCode;
- var errorMessage;
- var serviceErrorMessage;
- try {
- errorCode = aXML.getElementsByTagName("Error")[0].getAttribute('Code');
- serviceErrorMessage = aXML.getElementsByTagName("error")[0].textContent;
- } catch (ex) {
- errorCode = "999" // in case the error xml is invalid
- }
-
- switch (errorCode) {
- case "1": // API key missing (should never happen, but...)
- case "14": // API key invalid
- case "15": // API key over the daily query limit (I hope it will never happen)
- error.errorCode = error.PHOTOSERVICE_INVALID_API_KEY;
- break;
-
- case "2": // A method was not submitted with the request
- case "3": // The query parameter was not submitted with the request
- case "4": // The results parameter must be an integer between 1 and 50
- case "5": // The query parameter was not submitted with the request
- case "7": // The showAdult parameter must be 0 or 1
- case "8": // The tagresults parameter must be an integer between 1 and 50
- case "9": // The channelresults parameter must be an integer between 1 and 50
- case "10": // The categoryresults parameter must be an integer between 1 and 50
- case "11": // The userresults parameter must be an integer between 1 and 50
- case "13": // The method you submitted with the request was not valid
- case "21": // The showRelatedItems parameter must be 0 or 1
- error.errorCode = error.PHOTOSERVICE_INVALID_QUERY;
- break;
-
- case "12":
- error.errorCode = error.PHOTOSERVICE_UNAVAILABLE;
- break;
-
- case "999":
- error.errorCode = error.PHOTOSERVICE_UNKNOWN_ERROR;
- break;
-
- default:
- error.errorCode = error.PHOTOSERVICE_UNKNOWN_ERROR;
- break;
- }
- }
- error.serviceErrorCode = errorCode;
- error.serviceErrorString = serviceErrorMessage;
- this._logger.error(error.errorString);
- return error;
- };
-
-
- searchvideoService.prototype.call =
- function searchvideoService_call(aListener, aMethod, aParams) {
- var inst = this;
- this._req = Cc['@mozilla.org/xmlextras/xmlhttprequest;1'].createInstance(Ci.nsIXMLHttpRequest);
- this._req.onreadystatechange = function (aEvt) {
- if(inst._req.readyState == 4) {
- if (inst._req.status/100 == 2) {
- var dom = inst._req.responseXML;
- var domResponse = dom.getElementsByTagName("Response")[0];
- if (domResponse.firstChild.nodeName == "Error") {
- var error = inst.getError('SERVICE_ERROR', dom, null);
- aListener.onError(error);
- }
- else
- aListener.onResult(domResponse);
- }
- else if (inst._req.status/100 == 4) {
- var dom = inst._req.responseXML;
- var domResponse = dom.getElementsByTagName("Response")[0];
- if (domResponse && (domResponse.firstChild.nodeName == "Error")) {
- var error = inst.getError('SERVICE_ERROR', dom, null);
- aListener.onError(error);
- }
- else {
- // http errors
- aListener.onError(inst.getError("HTTP_ERROR", null, inst._req.status));
- }
- }
- else {
- // http errors
- aListener.onError(inst.getError("HTTP_ERROR", null, inst._req.status));
- }
- }
- };
- var body = "appid="+APPID+"&method="+aMethod;
- for (var k in aParams) {
- var v = aParams[k];
- if (v == null || v == undefined)
- v = "";
- body += ("&"+k+"="+escape(v));
- }
- dump("JMC: searchvideo querystring is " + body + "\n");
- this._req.open("GET", 'http://api.searchvideo.com/apiv3?'+body, true);
- this._req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded", false);
- rval = this._req.send(null);
- }
-
- // BEGIN flockIMediaWebService interface
- searchvideoService.prototype.decorateForMedia =
- function searchvideoService_decorateForMedia(aDocument) {
- DEBUG("{flockIMediaWebService}.decorateForMedia(aDocument)");
- var results = Cc["@mozilla.org/hash-property-bag;1"]
- .createInstance(Ci.nsIWritablePropertyBag2);
- if (this.webDetective.detect("searchvideo", "person", aDocument, results)) {
- var mediaArr = new Array();
- var media = {
- name: results.getPropertyAsAString("username"),
- query: "user:" + results.getPropertyAsAString("userid"),
- label: results.getPropertyAsAString("username"),
- favicon: this.icon,
- service: this.shortName
- }
- mediaArr.push(media);
- if (!aDocument._flock_decorations) {
- aDocument._flock_decorations = new Object();
- }
- aDocument._flock_decorations.mediaArr = mediaArr;
- this.obs.notifyObservers(aDocument, "media", "media:update");
- }
- }
- // END flockIMediaWebService
-
- // ========== END searchvideoService class ==========
-
-
- // ================================================
- // ========== BEGIN XPCOM Module support ==========
- // ================================================
-
- function createModule(aParams) {
- var Cc = Components.classes;
- var Ci = Components.interfaces;
- var Cr = Components.results;
- return {
- registerSelf: function (aCompMgr, aFileSpec, aLocation, aType) {
- aCompMgr.QueryInterface(Ci.nsIComponentRegistrar);
- aCompMgr.registerFactoryLocation( aParams.CID, aParams.componentName,
- aParams.contractID, aFileSpec,
- aLocation, aType );
- var catMgr = Cc["@mozilla.org/categorymanager;1"]
- .getService(Ci.nsICategoryManager);
- catMgr.addCategoryEntry( "flock-startup", aParams.componentName,
- "service,"+aParams.contractID, true, true );
- if (!aParams.categories) { aParams.categories = []; }
- for (var i = 0; i < aParams.categories.length; i++) {
- var cat = aParams.categories[i];
- catMgr.addCategoryEntry( cat.category, cat.entry,
- cat.value, true, true );
- }
- },
- getClassObject: function (aCompMgr, aCID, aIID) {
- if (!aCID.equals(aParams.CID)) { throw Cr.NS_ERROR_NO_INTERFACE; }
- if (!aIID.equals(Ci.nsIFactory)) { throw Cr.NS_ERROR_NOT_IMPLEMENTED; }
- return { // Factory
- createInstance: function (aOuter, aIID) {
- if (aOuter != null) { throw Cr.NS_ERROR_NO_AGGREGATION; }
- var comp = new aParams.componentClass();
- if (aParams.implementationFunc) { aParams.implementationFunc(comp); }
- return comp.QueryInterface(aIID);
- }
- };
- },
- canUnload: function (aCompMgr) { return true; }
- };
- }
-
- // NS Module entrypoint
- function NSGetModule(aCompMgr, aFileSpec) {
- return createModule({
- componentClass: searchvideoService,
- CID: SEARCHVIDEO_CID,
- contractID: SEARCHVIDEO_CONTRACTID,
- componentName: "Searchvideo JS Component",
- implementationFunc: function (aComp) { getCompTK().addAllInterfaces(aComp); },
- categories: [ // "flock-startup" is automagically added
- { category: "flockIPhotoAPI", entry: "searchvideo", value: SEARCHVIDEO_CONTRACTID }
- ]
- });
- }
-
- // ========== END XPCOM Module support ==========
-